#include <bits/stdc++.h>
using namespace std;
int cs[100001];
struct cars{
    int s,v,a;
}a[500001];
int lst;
int cnt;
int st[100001];
int main(){

   freopen("detect.in","r",stdin);
   freopen("detect.out","w",stdout);
    int t;
    cin>>t;
    while(t--){
        int n,m,l,v;
        cin>>n>>m>>l>>v;
        for(int i=1;i<=n;i++){
            cin>>a[i].s>>a[i].v>>a[i].a;
        }
        for(int i=1;i<=m;i++){
            cin>>cs[i];
        }
        sort(cs+1,cs+m+1);
        if(a[1].a==0){
            for(int i=1;i<=n;i++){
                if(a[i].v>v){
                    if(a[i].s<=cs[m]){
                        lst=1;
                        cnt++;
                    }
                }
            }
            cout<<cnt<<' ';
            if(lst)cout<<m-1<<endl;
            else cout<<m<<endl;
            cnt=lst=0;
        }
        if(a[1].a>0){
            for(int i=1;i<=n;i++){
                double t=0;
                t=(v*1.00*v-a[i].v*1.00*a[i].v)*1.00/(a[i].a*2.00)+a[i].s;
                if(t<cs[m]&&a[i].s<=cs[m]){
                    cnt++;
                    lst=1;
                }
            }
            cout<<cnt<<' ';
            if(lst)cout<<m-1<<endl;
            else cout<<m<<endl;
            cnt=lst=0;
        }
        if(a[1].a<0){

            for(int i=1;i<=n;i++){
                double t=0;
                t=(v*1.00*v-a[i].v*1.00*a[i].v)*1.00/(a[i].a*2.00)+a[i].s;
                int f=t;
                int l=lower_bound(cs+1,cs+m+1,a[i].s)-cs;

                if(t>cs[l]){
                    cnt++;
                    st[l]++;
                }
            }
            int x=0;

            for(int i=1;i<=m;i++){

                if(st[i]>0)x++;

            }
            cout<<cnt<<' ';
            cout<<m-x<<endl;
            memset(st,0,sizeof(st));
            cnt=lst=0;
        }
    }
}
